{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bd0767f1-e6c8-4882-a019-a6b329ff80c5",
   "metadata": {},
   "source": [
    "# Hamiltonian Evolution for a Water Molecule"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7e91388-b582-4cc0-a751-458018ee4cc6",
   "metadata": {},
   "source": [
    "This tutorial demonstrates the ability of the Classiq synthesis engine to reduce depth and cx-counts in approximated quantum functions for Hamiltonian evolution, focusing on Suzuki-Trotter (ST) and qDRIFT (qD) product formulas and their controlled operations. In addition, it is compared to the equivalent quantum examples in Qiskit.\n",
    "\n",
    "The demonstration is for the Hamiltonian of a water molecule, which has 551 terms and a dimension of 12 qubits."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "413480ab-1651-4c7d-94db-1ce8e5f69d20",
   "metadata": {},
   "source": [
    "Define a molecule and get the Hamiltonian as a list of Pauli strings and coefficients:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d64a5d31-f78a-4078-9b29-01745baff9ea",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:43.864837Z",
     "iopub.status.busy": "2024-05-07T13:30:43.864403Z",
     "iopub.status.idle": "2024-05-07T13:30:50.116208Z",
     "shell.execute_reply": "2024-05-07T13:30:50.115394Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq.applications.chemistry import Molecule, MoleculeProblem\n",
    "\n",
    "molecule_H2O = Molecule(\n",
    "    atoms=[(\"O\", (0.0, 0.0, 0.0)), (\"H\", (0, 0.586, 0.757)), (\"H\", (0, 0.586, -0.757))]\n",
    ")\n",
    "\n",
    "gs_problem = MoleculeProblem(\n",
    "    molecule=molecule_H2O,\n",
    "    basis=\"sto3g\",\n",
    "    mapping=\"jordan_wigner\",\n",
    "    z2_symmetries=False,\n",
    "    freeze_core=True,\n",
    ")\n",
    "\n",
    "pauli_list = gs_problem.generate_hamiltonian().pauli_list"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01b28568-abd7-4d5f-92a3-563c4046079a",
   "metadata": {},
   "source": [
    "Transfer the Hamiltonian to the relevant structure in Classiq:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f7aac614-005f-4614-99fb-de19a34d1c3b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:50.121986Z",
     "iopub.status.busy": "2024-05-07T13:30:50.120458Z",
     "iopub.status.idle": "2024-05-07T13:30:50.129391Z",
     "shell.execute_reply": "2024-05-07T13:30:50.128625Z"
    }
   },
   "outputs": [],
   "source": [
    "from typing import cast\n",
    "\n",
    "from classiq import Pauli, PauliTerm\n",
    "\n",
    "my_list = {\"I\": Pauli.I, \"X\": Pauli.X, \"Y\": Pauli.Y, \"Z\": Pauli.Z}\n",
    "\n",
    "\n",
    "def pauli_str_to_enums(pauli):\n",
    "    return [my_list[s] for s in pauli]\n",
    "\n",
    "\n",
    "def pauli_list_to_hamiltonian(pauli_list):\n",
    "    return [\n",
    "        PauliTerm(\n",
    "            pauli=pauli_str_to_enums(pauli), coefficient=cast(complex, coeff).real\n",
    "        )\n",
    "        for pauli, coeff in pauli_list\n",
    "    ]\n",
    "\n",
    "\n",
    "hamiltonian = pauli_list_to_hamiltonian(pauli_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ecd6398-cf5b-4f1b-8030-0db67240632d",
   "metadata": {},
   "source": [
    "These cases are examined:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0d298142-af2e-4f58-b72f-c672ff884632",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:50.134183Z",
     "iopub.status.busy": "2024-05-07T13:30:50.133170Z",
     "iopub.status.idle": "2024-05-07T13:30:50.137731Z",
     "shell.execute_reply": "2024-05-07T13:30:50.137161Z"
    }
   },
   "outputs": [],
   "source": [
    "ORDERS_for_ST = [1, 2, 4]\n",
    "REPETITIONS_for_ST = [6, 4, 1]\n",
    "N_QDS_for_qDRIFT = [1000, 2000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d148c026-b738-4d20-a52d-5baa2744c895",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:50.141639Z",
     "iopub.status.busy": "2024-05-07T13:30:50.140626Z",
     "iopub.status.idle": "2024-05-07T13:30:50.144936Z",
     "shell.execute_reply": "2024-05-07T13:30:50.144371Z"
    }
   },
   "outputs": [],
   "source": [
    "classiq_depths = []\n",
    "classiq_cx_counts = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "bc0c3580-0eca-4d28-9ed9-aac79c4c7fee",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:50.148889Z",
     "iopub.status.busy": "2024-05-07T13:30:50.147800Z",
     "iopub.status.idle": "2024-05-07T13:30:50.152173Z",
     "shell.execute_reply": "2024-05-07T13:30:50.151583Z"
    }
   },
   "outputs": [],
   "source": [
    "# transpilation_options = {\"classiq\": \"custom\", \"qiskit\": 3}\n",
    "transpilation_options = {\"classiq\": \"auto optimize\", \"qiskit\": 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4df7bde1-2d12-4645-9315-9e289c46c3df",
   "metadata": {},
   "source": [
    "## 1. Approximating with Suzuki-Trotter formulas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8a323cb5-c0a1-446c-9e47-b1cb5b4c80c5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:30:50.156151Z",
     "iopub.status.busy": "2024-05-07T13:30:50.155155Z",
     "iopub.status.idle": "2024-05-07T13:35:08.619707Z",
     "shell.execute_reply": "2024-05-07T13:35:08.619077Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import (\n",
    "    CustomHardwareSettings,\n",
    "    Preferences,\n",
    "    QArray,\n",
    "    QuantumProgram,\n",
    "    allocate,\n",
    "    create_model,\n",
    "    qfunc,\n",
    "    set_preferences,\n",
    "    suzuki_trotter,\n",
    "    synthesize,\n",
    ")\n",
    "\n",
    "preferences = Preferences(\n",
    "    custom_hardware_settings=CustomHardwareSettings(basis_gates=[\"cx\", \"u\"]),\n",
    "    transpilation_option=transpilation_options[\"classiq\"],\n",
    ")\n",
    "\n",
    "for k in range(len(ORDERS_for_ST)):\n",
    "\n",
    "    @qfunc\n",
    "    def main() -> None:\n",
    "        qbv = QArray(\"qbv\")\n",
    "        allocate(len(pauli_list[0][0]), qbv)\n",
    "        suzuki_trotter(\n",
    "            pauli_operator=hamiltonian,\n",
    "            evolution_coefficient=1,\n",
    "            order=ORDERS_for_ST[k],\n",
    "            repetitions=REPETITIONS_for_ST[k],\n",
    "            qbv=qbv,\n",
    "        )\n",
    "\n",
    "    qmod = create_model(main)\n",
    "\n",
    "    qmod = set_preferences(qmod, preferences=preferences)\n",
    "    qprog = synthesize(qmod)\n",
    "\n",
    "    circuit = QuantumProgram.from_qprog(qprog)\n",
    "\n",
    "    classiq_depths.append(circuit.transpiled_circuit.depth)\n",
    "    classiq_cx_counts.append(circuit.transpiled_circuit.count_ops[\"cx\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebb8ec58-ddf2-4d58-abc6-b3bfc4c101b5",
   "metadata": {},
   "source": [
    "## 2. Implementing Controlled Hamiltonian Dynamics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "dc5ac60e-b552-4caa-9d33-dd754f132193",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:35:08.622665Z",
     "iopub.status.busy": "2024-05-07T13:35:08.622152Z",
     "iopub.status.idle": "2024-05-07T13:39:15.752845Z",
     "shell.execute_reply": "2024-05-07T13:39:15.752118Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import QBit, control\n",
    "\n",
    "for k in range(2):\n",
    "\n",
    "    @qfunc\n",
    "    def main() -> None:\n",
    "        qbv = QArray(\"qbv\")\n",
    "        allocate(len(pauli_list[0][0]), qbv)\n",
    "        ctrl = QBit(\"ctrl\")\n",
    "        allocate(1, ctrl)\n",
    "        control(\n",
    "            ctrl=ctrl,\n",
    "            operand=lambda: suzuki_trotter(\n",
    "                pauli_operator=hamiltonian,\n",
    "                evolution_coefficient=1,\n",
    "                order=ORDERS_for_ST[k],\n",
    "                repetitions=REPETITIONS_for_ST[k],\n",
    "                qbv=qbv,\n",
    "            ),\n",
    "        )\n",
    "\n",
    "    qmod = create_model(main)\n",
    "\n",
    "    qmod = set_preferences(qmod, preferences=preferences)\n",
    "    qprog = synthesize(qmod)\n",
    "    circuit = QuantumProgram.from_qprog(qprog)\n",
    "\n",
    "    classiq_depths.append(circuit.transpiled_circuit.depth)\n",
    "    classiq_cx_counts.append(circuit.transpiled_circuit.count_ops[\"cx\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18cc481e-592a-4c37-bfbf-ce2c03e745b4",
   "metadata": {},
   "source": [
    "## 3. Approximating with the qDRIFT Formula"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "513a076e-53f0-4db2-b6ce-c8a45231f81f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:39:15.756421Z",
     "iopub.status.busy": "2024-05-07T13:39:15.756161Z",
     "iopub.status.idle": "2024-05-07T13:40:26.996106Z",
     "shell.execute_reply": "2024-05-07T13:40:26.995492Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import qdrift\n",
    "\n",
    "for n_qd in N_QDS_for_qDRIFT:\n",
    "\n",
    "    @qfunc\n",
    "    def main() -> None:\n",
    "        qbv = QArray(\"qbv\")\n",
    "        allocate(len(pauli_list[0][0]), qbv)\n",
    "        qdrift(\n",
    "            pauli_operator=hamiltonian,\n",
    "            evolution_coefficient=1,\n",
    "            num_qdrift=n_qd,\n",
    "            qbv=qbv,\n",
    "        )\n",
    "\n",
    "    qmod = create_model(main)\n",
    "\n",
    "    qmod = set_preferences(qmod, preferences=preferences)\n",
    "    qprog = synthesize(qmod)\n",
    "    circuit = QuantumProgram.from_qprog(qprog)\n",
    "\n",
    "    classiq_depths.append(circuit.transpiled_circuit.depth)\n",
    "    classiq_cx_counts.append(circuit.transpiled_circuit.count_ops[\"cx\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6f5aa9d-6db0-4573-ae44-e8dfe462f34d",
   "metadata": {},
   "source": [
    "## 4. Comparing to Qiskit Implementation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad0fc034-3256-45a8-b720-242ff23c5eb4",
   "metadata": {},
   "source": [
    "Comments:\n",
    "* Qiskit's Suzuki-Trotter of order 1 is a separate function, called the Lie-Trotter function.\n",
    "* Qiskit's qDRIFT takes a long time to run for unclear problems. Alternatively, a random product formula is implemented, which is equivalent to qDRIFT.\n",
    "\n",
    "The qiskit data was generated using qiskit version 1.0.0. To run the qiskit code uncomment the commented cells below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4378be53-a9e0-428a-926d-446876dca344",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:26.998916Z",
     "iopub.status.busy": "2024-05-07T13:40:26.998526Z",
     "iopub.status.idle": "2024-05-07T13:40:27.001782Z",
     "shell.execute_reply": "2024-05-07T13:40:27.001215Z"
    }
   },
   "outputs": [],
   "source": [
    "qiskit_cx_counts = [25164, 33508, 41882, 186067, 248232, 3581, 7404]\n",
    "qiskit_depths = [30627, 42879, 53581, 300924, 402125, 3463, 7141]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "24af414b-5dbf-454e-9174-a45f3639f143",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.004186Z",
     "iopub.status.busy": "2024-05-07T13:40:27.003692Z",
     "iopub.status.idle": "2024-05-07T13:40:27.006873Z",
     "shell.execute_reply": "2024-05-07T13:40:27.006328Z"
    }
   },
   "outputs": [],
   "source": [
    "# from importlib.metadata import version\n",
    "# try:\n",
    "#     import qiskit\n",
    "#     if version('qiskit') != \"1.0.0\":\n",
    "#       !pip uninstall qiskit -y\n",
    "#       !pip install qiskit==1.0.0\n",
    "# except ImportError:\n",
    "#     !pip install qiskit==1.0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1bb7fa99-5386-4e77-83fd-1bb16c8b5ce1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.009237Z",
     "iopub.status.busy": "2024-05-07T13:40:27.008732Z",
     "iopub.status.idle": "2024-05-07T13:40:27.011880Z",
     "shell.execute_reply": "2024-05-07T13:40:27.011277Z"
    }
   },
   "outputs": [],
   "source": [
    "# from qiskit.circuit.library import PauliEvolutionGate\n",
    "# from qiskit.quantum_info import SparsePauliOp\n",
    "# from qiskit.synthesis import LieTrotter as LieTrotter_qiskit\n",
    "\n",
    "# qiskit_depths = []\n",
    "# qiskit_cx_counts = []\n",
    "\n",
    "# operator = SparsePauliOp.from_list(pauli_list)\n",
    "# gate = PauliEvolutionGate(operator, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0eb7f9a6-35b3-4af3-b3cf-1d426c1b8ac4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.014200Z",
     "iopub.status.busy": "2024-05-07T13:40:27.013849Z",
     "iopub.status.idle": "2024-05-07T13:40:27.016775Z",
     "shell.execute_reply": "2024-05-07T13:40:27.016119Z"
    }
   },
   "outputs": [],
   "source": [
    "# ## Suzuki-Trotter of order 1 = Lie-Trotter\n",
    "# from qiskit import transpile\n",
    "\n",
    "# lt = LieTrotter_qiskit(reps=REPETITIONS_for_ST[0])\n",
    "# circ = lt.synthesize(gate)\n",
    "# tqc = transpile(\n",
    "#     circ, basis_gates=[\"u\", \"cx\"], optimization_level=transpilation_options[\"qiskit\"]\n",
    "# )\n",
    "# qiskit_depths.append(tqc.depth())\n",
    "# qiskit_cx_counts.append(tqc.count_ops()[\"cx\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "13e10729-8ab9-43b6-b9a5-10da29344c77",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.019130Z",
     "iopub.status.busy": "2024-05-07T13:40:27.018777Z",
     "iopub.status.idle": "2024-05-07T13:40:27.021649Z",
     "shell.execute_reply": "2024-05-07T13:40:27.021023Z"
    }
   },
   "outputs": [],
   "source": [
    "# ## Suzuki-Trotter\n",
    "# from qiskit.synthesis import SuzukiTrotter as SuzukiTrotter_qiskit\n",
    "\n",
    "# for k in range(1, 3):\n",
    "#     st = SuzukiTrotter_qiskit(order=ORDERS_for_ST[k], reps=REPETITIONS_for_ST[k])\n",
    "#     circ = st.synthesize(gate)\n",
    "#     tqc = transpile(\n",
    "#         circ,\n",
    "#         basis_gates=[\"u\", \"cx\"],\n",
    "#         optimization_level=transpilation_options[\"qiskit\"],\n",
    "#     )\n",
    "#     qiskit_depths.append(tqc.depth())\n",
    "#     qiskit_cx_counts.append(tqc.count_ops()[\"cx\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "147fcc08-34a2-401d-99d7-4e86cb2970d6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.024105Z",
     "iopub.status.busy": "2024-05-07T13:40:27.023596Z",
     "iopub.status.idle": "2024-05-07T13:40:27.026828Z",
     "shell.execute_reply": "2024-05-07T13:40:27.026247Z"
    }
   },
   "outputs": [],
   "source": [
    "# # Controlled dynamics\n",
    "# lt_ctrl = LieTrotter_qiskit(reps=REPETITIONS_for_ST[0])\n",
    "# circ = lt_ctrl.synthesize(gate).control(1)\n",
    "# tqc = transpile(\n",
    "#     circ, basis_gates=[\"u\", \"cx\"], optimization_level=transpilation_options[\"qiskit\"]\n",
    "# )\n",
    "# qiskit_depths.append(tqc.depth())\n",
    "# qiskit_cx_counts.append(tqc.count_ops()[\"cx\"])\n",
    "\n",
    "# for k in range(1, 2):\n",
    "#     st_ctrl = SuzukiTrotter_qiskit(order=ORDERS_for_ST[k], reps=REPETITIONS_for_ST[k])\n",
    "#     circ = st_ctrl.synthesize(gate).control(1)\n",
    "#     tqc = transpile(\n",
    "#         circ,\n",
    "#         basis_gates=[\"u\", \"cx\"],\n",
    "#         optimization_level=transpilation_options[\"qiskit\"],\n",
    "#     )\n",
    "#     qiskit_depths.append(tqc.depth())\n",
    "#     qiskit_cx_counts.append(tqc.count_ops()[\"cx\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a2a13e01-e283-44fb-b65f-f50c3e9edc6a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.029181Z",
     "iopub.status.busy": "2024-05-07T13:40:27.028802Z",
     "iopub.status.idle": "2024-05-07T13:40:27.032430Z",
     "shell.execute_reply": "2024-05-07T13:40:27.031748Z"
    }
   },
   "outputs": [],
   "source": [
    "# ## For qDRIFT, generate a random sequence\n",
    "# import numpy as np\n",
    "\n",
    "\n",
    "# def index_channel(n, list_coe):\n",
    "#     \"\"\"\n",
    "#     This function gets an ordered list of coefficients 'list_coe' and a number of calls 'n' as inputs.\n",
    "#     It returns a random ordered list of size n with elements from list_coe',\n",
    "#     where the probability of choosing the i-th elements is list_coe[i]/sum(list_coe),\n",
    "#     \"\"\"\n",
    "#     coe = np.array(list_coe) / sum(list_coe)\n",
    "#     c_coe = np.cumsum(coe)\n",
    "#     return np.searchsorted(c_coe, np.random.uniform(size=n))\n",
    "\n",
    "\n",
    "# assert (\n",
    "#     pauli_list[0][0] == len(pauli_list[0][0]) * \"I\"\n",
    "# ), \"\"\"The Identity term is not the first on the list of Paulis,\n",
    "# please modify the code accordingly \"\"\"\n",
    "\n",
    "# pauli_list_without_id = pauli_list[1::]\n",
    "# po_coe = [\n",
    "#     np.abs(np.real(p[1])) for p in pauli_list_without_id\n",
    "# ]  # gets absolute value of coefficients\n",
    "\n",
    "# for n_qd in N_QDS_for_qDRIFT:\n",
    "#     new_indices = index_channel(n_qd, po_coe)\n",
    "#     small_lambda = sum(po_coe)\n",
    "#     randomly_generated_pauli_list = [\n",
    "#         (\n",
    "#             pauli_list_without_id[new_indices[k]][0],\n",
    "#             np.sign(pauli_list_without_id[new_indices[k]][1]) * small_lambda / n_qd,\n",
    "#         )\n",
    "#         for k in range(n_qd)\n",
    "#     ]\n",
    "#     randomly_generated_pauli_list += [pauli_list[0]]  # adding the identity\n",
    "#     gate_qd = PauliEvolutionGate(\n",
    "#         SparsePauliOp.from_list(randomly_generated_pauli_list), 1\n",
    "#     )\n",
    "#     qd = LieTrotter_qiskit(reps=1)\n",
    "#     circ = qd.synthesize(gate_qd)\n",
    "#     tqc = transpile(\n",
    "#         circ,\n",
    "#         basis_gates=[\"u\", \"cx\"],\n",
    "#         optimization_level=transpilation_options[\"qiskit\"],\n",
    "#     )\n",
    "#     qiskit_depths.append(tqc.depth())\n",
    "#     qiskit_cx_counts.append(tqc.count_ops()[\"cx\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1da75c20-bb12-4884-862f-7f341874f764",
   "metadata": {},
   "source": [
    "## 5. Plotting the Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "e455df3f-96c0-4c70-a78b-1914644bf7f8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.034716Z",
     "iopub.status.busy": "2024-05-07T13:40:27.034355Z",
     "iopub.status.idle": "2024-05-07T13:40:27.037888Z",
     "shell.execute_reply": "2024-05-07T13:40:27.037269Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The cx-counts on Classiq: [15588, 20798, 25992, 22188, 29598, 3330, 6330]\n",
      "The cx-counts on Qiskit: [25164, 33508, 41882, 186067, 248232, 3581, 7404]\n"
     ]
    }
   ],
   "source": [
    "print(\"The cx-counts on Classiq:\", classiq_cx_counts)\n",
    "print(\"The cx-counts on Qiskit:\", qiskit_cx_counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b62b44d6-4525-4c0a-92b1-61998cd945f9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T13:40:27.040038Z",
     "iopub.status.busy": "2024-05-07T13:40:27.039869Z",
     "iopub.status.idle": "2024-05-07T13:40:27.364736Z",
     "shell.execute_reply": "2024-05-07T13:40:27.364016Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f165654b210>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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0r7btm1D69atUbhwYbi7u8PPzw/z5s2DTqcz2378+PEYOnQoChUqlB2hExERkR1joWhlFy9eRL169bBmzRps3bo1S/tOmzYN7dq1g4uLC3bu3Injx4+jdevWGDJkCDp27IjU1FSj9qdPn8aePXswdOjQ7HwLREREZKe01g4gvzt9+jQCAwMxffp0eHh4WLzfr7/+io8//hg1atTA2rVr4ejoCOBZ8fjw4UP88MMPmDZtGj777DN1n7Fjx2LChAlwcXHJ9vdBRERE9oc9ilbWoUMHhIWFZalIBICJEycCAIYMGaIWiXojR44EAEyfPh1JSUkAgH379uHKlSvo1avXywdNRERE+QJ7FK3MwcEhy/vcvXsX+/btAwAEBgaaPF+1alWULl0a165dw9atW/HWW29hz549SEpKgp+fn9run3/+QXx8POrVqwcA+OOPP+Dk5GT2byYnJyM5Odlke3x8fJbjJyIiItvAHkUbFBkZCZ1OB0dHR1SqVMlsm2rVqgEAjh49CgCYNGkS/v77b0RHR6uPN954Az4+Puq/MyoSAWDq1Knw8vIyebRo0SL73yARERHlCSwUbZB+RZVixYpBozH/f6G3t7dR25f1ySef4NGjRyaP/fv3Z8vrExERUd7DQtEGxcXFAQBcXV0zbOPm5gYAePTokclzS5YsQb169bBx40bcuHED9erVw0cffZTp33R2doanp6fJI6v3VhIREZHt4D2K+VCPHj3Qo0cPa4dBREREeRx7FG2Qp6cnAKgjms1JTEwEAHh5eeVKTERERGR/WCjaIP0Alrt372a4AsvNmzeN2hIRERFlFQtFG+Tv7w+NRoOUlJQMB6ucO3cOABAQEJCboREREZEdYaFog4oXL65OS7N7926T5//66y9cu3YNBQoUQNu2bXM7PCIiIrITLBRt1IQJEwAA8+bNM1nTeebMmQCA0aNHq6OfiYiIiLKKo57zgLt37yItLc1km35N5pIlS5rs06JFC0yZMgWfffYZOnXqhC+++AIeHh746aef8MMPP6B9+/b45JNPsi3G0NBQhIaGmmzPbEANERER2TZFRMTaQeR35cuXx5UrVzJ8PrP/i7Zu3YqZM2ciMjISKSkp8PX1RZ8+fRASEvJCywNmVVRUFPz9/XHs2DGj5QGJiIgo77L0+5s9innA5cuXX3jfdu3aoV27dtkXDBEREdH/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yeXLl23yMuqL5CskJES8vb3lvffek65du0rx4sWlfv366qXljG5VsId82TsWigYMD2T9dBHVq1eXgQMHqr+M7t69KwEBAaIoirzxxhtq+8xOIGlpabJ161ZRFEV8fHzkr7/+UrfbKubKMoZxnz59WkJDQ6V9+/by999/mzyvd/ToUalataq88cYbMmLECClVqpS89dZbdn/j94vkavPmzVKrVi1ZtmyZmpeUlBQJDQ0VLy8vOXLkSO4En8teJFcizz63T548kSZNmsiUKVNk3bp14uDgIO+//75Rz6JI5j/qbIlhLo4ePSoTJ06UcuXKycyZMzPcZ/ny5eLj4yONGjWSMmXKSLt27Z5bLNrqOSq9F8nX3LlzpVy5crJlyxZ1//3794uXl5eMHDnyuX+H8jYWiv9jWPh06tRJqlSpIg8ePJDJkydLs2bNZPXq1eqJMzo6WooVK5alGef79u0rRYsWlStXroiIbZ+EmSvLGJ4IFy9eLK+99pq4u7uLoijSoEEDtQhO78iRI1KvXj357bffRERk4sSJ4uPjY3GxaIuDDF4kVykpKfLFF19I48aN1WNF788//xSNRiMbNmzI9O/ml1zp6d/vggULpHPnziIi8v3334tGo5E+ffpIXFycrF27NsN7F22NYa6+++47ady4sXh6eoqiKOLi4iJTp0412efx48fSr18/KVeunBw5ckRmz55tcbFo614kX1evXpV27drJqFGjjAamPH78WNq0aSP/+te/ciV2yjksFMW0d6xSpUpGXzzbtm1Tb+DWf5B++ukn8fLyEkVRpG/fvmpbc0XNsWPHJCAgQM6dOycitn2SYa4sY3jCnTx5slSvXl1GjBghCxculFGjRkmjRo1k1apVZveNj483ymlsbKx88cUXWSoWbcnL5Oq3336TZcuWmbxebGysFC5cWMLDw3My9Fz3MrkytH79eilatKjcvn1bRJ59Rh0cHKRFixaiKIrMmjUrx95DbjHM1YQJE6Ry5coyb948OXDggPz2228yaNAgWbJkiUnPVkpKimzcuFFdmjAhIUGmTp1qUiza6g/YjLxovq5fvy6NGjWSHTt2qNv03xNff/21lCxZUuLj4+0uX/lJvi8UDQufvn37iqenpzx8+FBEng3nz6jt3bt3Zdq0aeqvrffee89sO5FnJxr9JKK2/GFhrixj+J7GjRsnhQoV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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "classiq_color = \"#D7F75B\"\n",
    "qiskit_color = \"#6FA4FF\"\n",
    "plt.rcParams[\"font.family\"] = \"serif\"\n",
    "plt.rc(\"savefig\", dpi=300)\n",
    "plt.rcParams[\"axes.linewidth\"] = 1\n",
    "plt.rcParams[\"xtick.major.size\"] = 5\n",
    "plt.rcParams[\"xtick.minor.size\"] = 5\n",
    "plt.rcParams[\"ytick.major.size\"] = 5\n",
    "plt.rcParams[\"ytick.minor.size\"] = 5\n",
    "\n",
    "plt.semilogy(\n",
    "    qiskit_cx_counts[-2::] + qiskit_cx_counts[0:5],\n",
    "    \"s\",\n",
    "    label=\"qiskit\",\n",
    "    markerfacecolor=qiskit_color,\n",
    "    markeredgecolor=\"k\",\n",
    "    markersize=6,\n",
    "    markeredgewidth=1.5,\n",
    ")\n",
    "plt.semilogy(\n",
    "    classiq_cx_counts[-2::] + classiq_cx_counts[0:5],\n",
    "    \"o\",\n",
    "    label=\"classiq\",\n",
    "    markerfacecolor=classiq_color,\n",
    "    markeredgecolor=\"k\",\n",
    "    markersize=6.5,\n",
    "    markeredgewidth=1.5,\n",
    ")\n",
    "\n",
    "labels = [\n",
    "    \"qDRIFT(N=1000)\",\n",
    "    \"qDRIFT(N=2000)\",\n",
    "    \"TS$_1$(reps=6)\",\n",
    "    \"TS$_2$(reps=4)\",\n",
    "    \"TS$_4$(reps=1)\",\n",
    "    \"ctrl-TS$_1$(reps=6)\",\n",
    "    \"ctrl-TS$_2$(reps=4)\",\n",
    "]\n",
    "plt.xticks([0, 1, 2, 3, 4, 5, 6], labels, rotation=45, fontsize=16, ha=\"right\")\n",
    "plt.ylabel(\"CX-counts\", fontsize=18)\n",
    "plt.yticks(fontsize=16)\n",
    "plt.legend(loc=\"upper left\", fontsize=18, fancybox=True, framealpha=0.5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
